home *** CD-ROM | disk | FTP | other *** search
/ Clickx 115 / Clickx 115.iso / software / tools / windows / tails-i386-0.16.iso / live / filesystem.squashfs / usr / share / pyshared / GdmGreeter / persistencewindow.py < prev    next >
Encoding:
Python Source  |  2013-01-10  |  7.6 KB  |  197 lines

  1. #!/usr/bin/python
  2. #
  3. # Copyright 2012 Tails developers <tails@boum.org>
  4. # Copyright 2011 Max <govnototalitarizm@gmail.com>
  5. # Copyright 2011 Martin Owens
  6. #
  7. # This program is free software: you can redistribute it and/or modify
  8. #  it under the terms of the GNU General Public License as published by
  9. #  the Free Software Foundation, either version 3 of the License, or
  10. #  (at your option) any later version.
  11. #
  12. #  This program is distributed in the hope that it will be useful,
  13. #  but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. #  GNU General Public License for more details.
  16. #
  17. #  You should have received a copy of the GNU General Public License
  18. #  along with this program.  If not, see <http://www.gnu.org/licenses/>
  19. #
  20. """First screen
  21.  
  22. """
  23.  
  24. import logging, gtk, gettext, os
  25. _ = gettext.gettext
  26. import GdmGreeter
  27. from GdmGreeter.language import TranslatableWindow
  28.  
  29. class PersistenceWindow(TranslatableWindow):
  30.     """First greeter screen"""
  31.  
  32.     def __init__(self, greeter):
  33.         self.greeter = greeter
  34.  
  35.         builder = gtk.Builder()
  36.         builder.set_translation_domain(GdmGreeter.__appname__)
  37.         builder.add_from_file(os.path.join(GdmGreeter.GLADE_DIR, "persistencewindow.glade"))
  38.         builder.connect_signals(self)
  39.  
  40.         self.moreoptions = False
  41.  
  42.         # Sets self.window
  43.         self.login_dialog = builder.get_object("login_dialog")
  44.         TranslatableWindow.__init__(self, self.login_dialog)
  45.         self.btn_persistence_yes = builder.get_object("persistence_yes_button")
  46.         self.btn_persistence_no = builder.get_object("persistence_no_button")
  47.         self.passphrase_box = builder.get_object("passphrase_box")
  48.         self.entry_passphrase = builder.get_object("passphrase_entry")
  49.         self.btn_moreoptions_yes = builder.get_object("moreoptions_yes_button")
  50.         self.btn_moreoptions_no = builder.get_object("moreoptions_no_button")
  51.         self.btn_login = builder.get_object("login_button")
  52.         self.img_login = builder.get_object("login_image")
  53.         self.img_next = builder.get_object("next_image")
  54.         self.box_persistence = builder.get_object("persistence_box")
  55.         self.readonly_checkbutton = builder.get_object("readonly_checkbutton")
  56.         self.warning_label = builder.get_object("warning_label")
  57.         self.warning_area = builder.get_object("warning_area")
  58.         self.warning_image = builder.get_object("warning_area")
  59.         # self.spinner = builder.get_object("spinner")
  60.         self.checked_img_moreoptions_yes = builder.get_object("moreoptions_yes_checked_img")
  61.         self.checked_img_moreoptions_no  = builder.get_object("moreoptions_no_checked_img")
  62.         self.checked_img_persistence_yes = builder.get_object("persistence_yes_checked_img")
  63.         self.checked_img_persistence_no  = builder.get_object("persistence_no_checked_img")
  64.  
  65.         self.warning_area.hide()
  66.  
  67.         # FIXME: list_containers may raise exceptions. Deal with that.
  68.         self.containers = [
  69.             { "path": container, "locked": True }
  70.             for container in self.greeter.persistence.list_containers()
  71.             ]
  72.         if len(self.containers) == 0:
  73.             self.box_persistence.hide()
  74.  
  75.         # FIXME:
  76.         # * support multiple persistent containers:
  77.         #   - display brand, model, partition path and size for each container
  78.         #   - create as many passphrase input fields as needed
  79.  
  80.     def activate_persistence(self):
  81.         """Ask the backend to activate persistence and handle errors
  82.  
  83.         Returns: True if everything went fine, False if the user should try again"""
  84.         if self.btn_persistence_yes.get_active():
  85.             try:
  86.                 self.greeter.persistence.activate(
  87.                     device=self.containers[0]['path'],
  88.                     password=self.entry_passphrase.get_text(),
  89.                     readonly=self.readonly_checkbutton.get_active()
  90.                     )
  91.                 return True
  92.             except GdmGreeter.errors.WrongPassphraseError:
  93.                 self.entry_passphrase.set_text('')
  94.                 self.warning_label.set_markup(_('<i>Wrong passphrase. Please try again.</i>'))
  95.                 self.warning_area.show_all()
  96.                 return False
  97.         else:
  98.             return True
  99.  
  100.     def set_persistence_visibility(self, persistence):
  101.         self.passphrase_box.set_visible(persistence)
  102.         if not persistence:
  103.             self.warning_area.hide()
  104.         self.btn_persistence_yes.set_active(persistence)
  105.         self.btn_persistence_no.set_active(not persistence)
  106.         if persistence:
  107.             self.checked_img_persistence_yes.show()
  108.             self.checked_img_persistence_no.hide()
  109.         else:
  110.             self.checked_img_persistence_yes.hide()
  111.             self.checked_img_persistence_no.show()
  112.         if persistence:
  113.             self.entry_passphrase.grab_focus()
  114.  
  115.     def cb_persistence_yes_toggled(self, widget, data=None):
  116.         persistence = widget.get_active()
  117.         self.set_persistence_visibility(persistence)
  118.  
  119.     def cb_persistence_no_toggled(self, widget, data=None):
  120.         persistence = not widget.get_active()
  121.         self.set_persistence_visibility(persistence)
  122.  
  123.     def update_login_button(self, moreoptions):
  124.         if moreoptions:
  125.             self.btn_login.set_label("gtk-go-forward")
  126.             self.btn_login.set_use_stock(True)
  127.         else:
  128.             self.btn_login.set_label(_("Login"))
  129.             self.btn_login.set_use_stock(False)
  130.             self.btn_login.set_image(self.img_login)
  131.  
  132.     def update_moreoptions_buttons(self, moreoptions):
  133.         self.btn_moreoptions_yes.set_active(moreoptions)
  134.         self.btn_moreoptions_no.set_active(not moreoptions)
  135.         if moreoptions:
  136.             self.checked_img_moreoptions_yes.show()
  137.             self.checked_img_moreoptions_no.hide()
  138.         else:
  139.             self.checked_img_moreoptions_yes.hide()
  140.             self.checked_img_moreoptions_no.show()
  141.  
  142.     def cb_moreoptions_yes_toggled(self, widget, data=None):
  143.         moreoptions = widget.get_active()
  144.         self.moreoptions = moreoptions
  145.         self.update_login_button(moreoptions)
  146.         self.update_moreoptions_buttons(moreoptions)
  147.  
  148.     def cb_moreoptions_no_toggled(self, widget, data=None):
  149.         moreoptions = not widget.get_active()
  150.         self.moreoptions = moreoptions
  151.         self.update_login_button(moreoptions)
  152.         self.update_moreoptions_buttons(moreoptions)
  153.  
  154.     def toggle_watch_cursor(self, on=True):
  155.         if on:
  156.             self.login_dialog.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH))
  157.         else:
  158.             self.login_dialog.window.set_cursor(None)
  159.         gtk.gdk.flush()
  160.  
  161.     def working(self, working=True):
  162.         # FIXME: set_sensitive more widgets?
  163.         self.btn_login.set_sensitive(not working)
  164.         self.toggle_watch_cursor(working)
  165.         # if working:
  166.         #     self.spinner.start()
  167.         #     self.spinner.show()
  168.         # else:
  169.         #     self.spinner.stop()
  170.         #     self.spinner.hide()
  171.  
  172.     def go(self):
  173.         self.working(True)
  174.         success = self.activate_persistence()
  175.         self.working(False)
  176.         if success:
  177.             # next
  178.             if self.moreoptions:
  179.                 self.window.hide()
  180.                 self.greeter.optionswindow.window.show()
  181.             # login
  182.             else:
  183.                 self.greeter.login()
  184.  
  185.     def cb_login_clicked(self, widget, data=None):
  186.         self.go()
  187.  
  188.     def key_press_event_cb(self, widget, event=None):
  189.         """Handle key press"""
  190.         if event:
  191.             if event.keyval in [ gtk.keysyms.Return, gtk.keysyms.KP_Enter ]:
  192.                 self.go()
  193.  
  194.     def delete_event_cb(self, widget, event=None):
  195.         """Ignore delete event (Esc)"""
  196.         return True
  197.